import 'package:path/path.dart' as Path;

extension ExtensionString on String {
  /// 字符串转数组
  List<String> stringToList({Pattern pattern = ','}) {
    if (length == 0) {
      return [];
    }
    return split(pattern);
  }

  /// 字符串去除空格和换行
  String get trimSpaceAndLinefeed {
    return replaceAll(RegExp(r"\s+\b|\b\s"), "");
  }

  /// 截取两字符串之间的内容（正则表达式）
  String analysis({required String start, required String end}) {
    RegExp exp = RegExp(r'\$start([^]*?)\$end');
    RegExpMatch? match = exp.firstMatch(this);
    return match?.group(1) ?? '';
  }

  // 获取路径文件扩展名 .png
  String get pathExtension {
    return Path.extension(this);
  }

  // 获取路径文件名 image.png
  String get pathFileName {
    return Path.basename(this);
  }

  /// 正则匹配文本中的十六进制颜色字符串
  /// 匹配不到，返回："000000"
  String get matchHexColor {
    RegExp regExp = RegExp(r'[\da-fA-F]{6}');
    RegExpMatch? match = regExp.firstMatch(this);
    return match?.group(0) ?? "000000";
  }

  /// 正则

  /// 是否含有中文
  bool get haveChinese {
    return RegExp(r"[\u4e00-\u9fa5]").hasMatch(this);
  }

  /// 邀请码
  /// [0-9]：数字
  /// *：出现0次或多次
  bool get availableInviteUid {
    return RegExp(r"^\d*$").hasMatch(this);
  }

  /// 微信号
  /// 1、以字母开头，后边可以是字母，数字，下划线或者减号，但是必须在6-20位之内
  /// 2、手机号
  /// 3、特殊的手机号，中间用*号代替也允许了
  ///
  /// 以字母开头 ^[a-zA-Z]，^与字符串开始的地方匹配
  /// 后面是[a-zA-Z0-9_-]，且出现次数为5-19次{5,19}, $代表与字符串结束的地方匹配
  bool get availableWX {
    if (availablePhone) {
      return true;
    }
    if (RegExp(r"^1[3-9][0-9]\*{4}[0-9]{4}$").hasMatch(this)) {
      return true;
    }
    return RegExp(r"^[a-zA-Z][a-zA-Z0-9_-]{5,19}$").hasMatch(this);
  }

  /// 手机号
  /// 11位数字，如：13412345678
  /// 以1开头 ^1
  /// 第2位是3-9，[3-9]
  /// 后面9位是任意数字 [0-9]{9}
  bool get availablePhone {
    return RegExp(r"^1[3-9][0-9]{9}$").hasMatch(this);
  }

  /// 座机号
  /// 区号-号码，如：020-10000、02010000、020-3636363、0755-10000、0755-3636363
  /// 区号：3-4位数字，以0开头 ^0,第2位[1-9]，后面是1-2位的任意数
  /// -分割线可有可无，-?
  /// 号码5位或7位 [0-9]{5} 或者 [0-9]{7}，小括号加|
  bool get availableTelPhone {
    return RegExp(r"^0[1-9][0-9]{1,2}-?([0-9]{5}|[0-9]{7})$").hasMatch(this);
  }

  /// 身份证号
  /// 1、二代身份证18位，前17位为数字，最后一位为数字或者英文字母x、X
  ///   - 六位数字地址码 + 八位数字出生日期码 + 三位数字顺序码 + 一位数字校验码（X代表10）
  ///   - 看需不需要严格按照码的要求去写，如生日格式需不需要对上，月份最大12月这些
  /// 2、一代身份证15位纯数字
  bool get availableIdCard {
    return RegExp(r"^[0-9]{17}[\d|xX]$|^[0-9]{15}$").hasMatch(this);
  }

  /// 邮箱号
  /// 名称 + @ + 电子邮箱的服务器域名，如：123456@qq.com
  /// 名称：任意数字、字母和下划线，\w，出现1次或多次 \w+（结果加转义符 \\w+ ）
  /// @：只出现一次
  /// 域名：
  ///   第一段：除了下划线的字母数字，[a-zA-Z0-9]，至少2位{2,}（结果加转义符 [a-zA-Z0-9]{2,} ）
  ///   第二段：.号加上2-3位字母的域名类型，（结果加转义符 \\.[a-zA-Z]{2,3} ），出现1到2次（.com.cn会有2次）（ (\\.[a-zA-Z]{2,3}){1,2} ）
  bool get availableEmail {
    return RegExp(r"^\w+@[a-zA-Z0-9]{2,}(\.[a-zA-Z]{2,3}){1,2}$").hasMatch(this);
  }
}
